/*global self, pi, postMessage */

/**
 * 渲染线程：渲染
 * 消息种类：
 * 1. 创建渲染环境消息：
 *	{
 *		type: "createContext",
 *		id: 代表该请求的唯一数字,
 *		data: window句柄
 *	}
 *	返回:
 *	{
 *		type: "createContext",
 *		id: 代表该请求的唯一数字,
 *		data: 成功渲染环境句柄，失败{error:, reason:}
 *	}
 * --------------------------
 * 2. 创建纹理渲染环境消息：
 *	{
 *		type: "createTexContext",
 *		id: 代表该请求的唯一数字,
 *		data: {
 *			width: 宽度
 *			height: 高度
 *		}
 *	}
 *	返回:
 *	{
 *		type: "createTexContext",
 *		id: 代表该请求的唯一数字,
 *		data: 成功纹理渲染环境句柄，失败{error:, reason:}
 *	}
 * --------------------------
 * 3. 销毁渲染环境消息：
 *	{
 *		type: "destroyContext",
 *		id: 代表该请求的唯一数字,
 *		data: 渲染环境句柄
 *  }
 *	返回:
 *	{
 *		type: "destroyContext",
 *		id: 代表该请求的唯一数字,
 *	}
 * --------------------------
 * 4. 从图片创建纹理消息：
 *	{
 *		type: "loadTex",
 *		id: 代表该请求的唯一数字,
 *		data: 图像句柄
 *  }
 *	返回:
 *	{
 *		type: "loadTex",
 *		id: 代表该请求的唯一数字,
 *		data:
 *			失败{error:, reason:}
 *			成功{data: 纹理句柄, width: 宽度, height: 高度}
 *	}
 * ------------------------------
 * 5. 创建空纹理消息：
 *	{
 *		type: "createTex",
 *		id: 代表该请求的唯一数字,
 *		data: {width: 宽度, height: 高度}
 *  }
 *	返回:
 *	{
 *		type: "createTex",
 *		id: 代表该请求的唯一数字,
 *		data:
 *			失败{error:, reason:}
 *			成功{data: 纹理句柄, width: 宽度, height: 高度}
 *	}
 * --------------------------
 * 5. 销毁纹理消息：
 *	{
 *		type: "destroyTex",
 *		id: 代表该请求的唯一数字,
 *		data: 纹理句柄
 *  }
 *	返回:
 *	{
 *		type: "destroyTex",
 *		id: 代表该请求的唯一数字,
 *	}
 * --------------------------
 * 用图片更新纹理
 *	{
 *		type: "updateTex",
 *		id: 代表该请求的唯一数字,
 *		data: {tex: 纹理句柄, img: 图像句柄}
 *	}
 *	返回：
 *	{
 *		type: "updateTex",
 *		id: 代表该请求的唯一数字,
 *		data: 成功{}，失败{error:, reason:}
 *	}
 * --------------------------
 * 6. 纹理变图像：
 *	{
 *		type: "getTexImage",
 *		id: 代表该请求的唯一数字,
 *		data: 纹理句柄
 *  }
 *	返回:
 *	{
 *		type: "getTexImage",
 *		id: 代表该请求的唯一数字,
 *		data: 成功图像句柄，失败{error:, reason:}
 *	}
 * --------------------------
 * 7. 渲染：
 *	{
 *		type: "render",
 *		id: 代表该请求的唯一数字,
 *		data: {
 *			context: 渲染环境句柄
 *			bytes: 字节缓冲区句柄
 *		}
 *  }
 *	返回:
 *	{
 *		type: "getTexImage",
 *		id: 代表该请求的唯一数字,
 *		data: 渲染是否成功
 *	}
 */
pi.mod.define('pi.worker.render', function (pi) {
	"use strict";
	var module = {};
	module.init = function () {
		var table = {}; /* 创建渲染环境 */
		table.createContext = function (data) {
			var h = pi.render.t3d.createContext(data);
			if (h === 0) {
				h = {
					error: 3,
					reason: "render worker, createContext"
				};
			}
			return h;
		};

		/* 创建纹理渲染环境 */
		table.createTexContext = function (data) {
			var h;
			if (pi.lang.isObject(data)) {
				h = pi.render.t3d.createTexContext(data.width, data.height);
				if (h === 0) {
					h = {
						error: 5,
						reason: "render worker, createTexContext"
					};
				}
			} else {
				h = {
					error: 6,
					reason: "render worker, data isn't object"
				};
			}
			return h;
		};

		/* 销毁渲染环境 */
		table.destroyContext = function (data) {
			pi.render.t3d.destroyContext(data);
		};

		/* 创建空纹理 */
		table.createTex = function (data) {
			var r, h = pi.render.t3d.createTex(data.width, data.height);
			if (h !== 0) {
				r = {
					data: h,
					width: data.width,
					height: data.height
				};
			} else {
				r = {
					error: 7,
					reason: "render worker, createTex"
				};
			}
			return r;
		};

		/* 图像变纹理 */
		table.loadTex = function (data) {
			var r, h = pi.render.t3d.loadTex(data);
			if (h !== 0) {
				r = {
					data: h,
					width: pi.render.t3d.getTexWidth(h),
					height: pi.render.t3d.getTexHeight(h)
				};
			} else {
				r = {
					error: 8,
					reason: "render worker, loadTex"
				};
			}
			return r;
		};

		/* 销毁纹理 */
		table.destroyTex = function (data) {
			pi.render.t3d.destroyTex(data);
		};

		/* 用图像更新纹理 */
		table.updateTex = function (data) {
			var h = {};
			if (!pi.render.t3d.updateTex(data.texture, data.image)) {
				h = {
					error: 10,
					reason: "render worker, updateTex"
				};
			}
			return h;
		};

		/* 纹理变图像 */
		table.getTexImage = function (data) {
			var h = pi.render.t3d.getTexImage(data);
			if (h === 0) {
				h = {
					error: 9,
					reason: "render worker, getTexImage"
				};
			}
			return h;
		};

		/* 渲染 */
		table.render = function (data) {
			if (pi.lang.isObject(data)) {
				pi.render.t3d.render(data.context, data.bytes);
				return true;
			}
		};
		return table;
	};

	module.onmessage = function (e) {
		var fun, res = 0,
			req = e.data;
		if (req === "quit") {
			self.close();
		} else if (pi.lang.isObject(req)) {
			if (module.methodTable === undefined) {
				module.methodTable = module.init();
			}
			if (module.methodTable && req.type) {
				fun = module.methodTable[req.type];
				if (fun !== undefined) {
					res = fun(req.data);
				} else {
					res = {
						error: 2,
						reason: "render worker, type isn't function name"
					};
				}
			} else {
				res = {
					error: 1,
					reason: "render worker, slef.methodTable && req.type"
				};
			}

			postMessage({
				type: req.type,
				id: req.id,
				data: res
			});
		}
	};
	return module;
});